#ifndef MAIN_INTERFACE_H
#define MAIN_INTERFACE_H

#include "read_only_delegate.h"

#include <QMainWindow>
#include <QSet>
#include <QStandardItemModel>
#include <QItemSelectionModel>
#include <QQueue>
#include <QSqlQuery>


QT_BEGIN_NAMESPACE
namespace Ui {
class MainInterface;
}
QT_END_NAMESPACE

class MainInterface : public QMainWindow
{
    Q_OBJECT

public:
    MainInterface(QWidget *parent = nullptr);
    ~MainInterface();

private:
    Ui::MainInterface *ui;


////  InformationManagePage
private:
    //数据模型
    QStandardItemModel* p0_m_tableDataModel;
    //选择模型
    QItemSelectionModel* p0_m_selectionModel;

    //搜索输入框存的值
    QString p0_m_lineEditText;
    //总页数
    int p0_m_pageAmount = 0;
    //现在的页数【改表，更新】
    int p0_m_nowPage = 1;
    //记录条数【每次查询，更新】
    int p0_m_recordAmount = 0;
    //每页多少条数据【固定】
    int p0_m_pageUnit = 50;
    //被修改过的行【查询、修改完后，更新】
    QSet<int> p0_m_alterRows;
    //被删除的行【批量删除前，更新】
    QSet<int> p0_m_deleteRows;
    //被删除的记录id
    QVariantList p0_m_deleteRecordID;
    //记录被修改的数据位置（行值、列值）【修改数据时，更新；批量修改和换标后，清空】
    QHash<int, QList<int>> p0_m_alterPosition;
    //记录表格主键【更新表头行时，更新】
    QVariant p0_m_tablePrimaryKeyField;

    //表名映射到界面
    QHash<QString, QString> p0_m_tableName2UseHash;
    //表字段映射到界面
    QHash<QPair<QString, QString>, QString> p0_m_tableFieldName2UseHash;

    //表名映射
    QHash<QString, QString> p0_m_use2TableNameHash;
    //表字段映射
    QHash<QPair<QString, QString>, QString> p0_m_use2TableFieldNameHash;

    //添加表字段信息（查找和更新时，使用）【更新表头行时，更新】
    QQueue<QString> p0_m_tableFieldQueue;

    //记录修改前的主键【批量修改后，更换表后，清空】
    QHash<int, QVariant> p0_m_primaryKeyValuePreviousHash;

    //主键的列数【更换表后，更新】
    int p0_m_primaryKeyColumnIndex = 0;

    //权限表中内容的字段下拉选项【表格字段显示时，更新】
    QHash<QString, QString> p0_m_permissionTableFieldSelect2ComboxHash;

    QHash<QString, QString> p0_m_combox2PermissionTableFieldSelectHash;

    //只读代理
    ReadOnlyDelegate p0_m_readOnlyDelegate;

private:
    void p0_initializeInformationManagePage();
    /**
     * @brief 初始化信息管理界面的表格、字段下拉框信息
     */
    void p0_initializeInformationManagePageContent();

    /**
     * @brief 初始化界面样式
     */
    void p0_initializeInformationManagePageSetStyleSheet();

    /**
     * @brief 初始化表名映射
     */
    void p0_initializeInformationManagePageTableHash();

    /**
     * @brief 初始化表格样式
     */
    void p0_initializeInformationManagePageTableViewModel();


    /**
     * @brief 显示表数据
     * @param query
     */
    void p0_tableInformationTableViewDataShowBySqlQuery(QSqlQuery &query);
    /**
     * @brief 全表显示
     */
    void p0_allTableInformationShow();
    /**
     * @brief 部分表显示
     */
    void p0_partTableInformationShow();

    /**
     * @brief 表头显示
     */
    void p0_tableViewHeadingShow();

    /**
     * @brief 批量修改记录
     */
    void p0_batchAlterRecord();
    /**
     * @brief 单挑修改记录
     */
    void p0_singleAlterRecord();
    /**
     * @brief 批量删除记录
     */
    void p0_batchDeleteRecord();
    /**
     * @brief 刷新表对应的字段
     * @param tableName
     */
    void p0_tableFieldComboxShow(QString tableName);

    /**
     * @brief 判断表中主键是否存在
     * @param primaryKeyField:主键的值
     * @return
     */
    bool p0_judgePrimaryKeyIsExistence(QVariant primaryKeyField);

    /**
     * @brief 导入数据到数据库
     * @param filePath
     */
    bool p0_importData2DataBase(QStringList filePaths);

    /**
     * @brief 导出数据到excel
     * @return
     */
    bool p0_exportData2XLSX();
    /**
     * @brief 得到权限信息表的内容
     */
    void p0_getPermissionInformation();
public slots:
    /**
     * @brief 搜索表格数据
     */
    void p0_searchTableData();

signals:
    /**
     * @brief 修改学生信息
     */
    void p0_show2AlterStudentInformationDialog(QString id);
    /**
     * @brief 新增学生信息
     */
    void p0_show2InsertStudentInformationDialog();
    /**
     * @brief 修改教师信息
     */
    void p0_show2AlterTeacherInformationDialog(QString id);
    /**
     * @brief 新增教师信息
     */
    void p0_show2InsertTeacherInformationDialog();

};
#endif // MAIN_INTERFACE_H
